package com.bt.lms.ui.page.sys.role;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.entity.Role;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.role.action.RLCompileRoleBtnAction;
import com.bt.lms.ui.page.sys.role.action.RLDeleteBtnAction;
import com.bt.lms.ui.page.sys.utils.MyButton;
import com.bt.lms.ui.page.sys.vo.RoleInfoVo;
import com.bt.lms.ui.page.sys.vo.RoleTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.util.Callback;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 角色列表界面
 * @author 徐大永
 */
public class RoleTableView extends TableView<RoleInfoVo> {

    /**
     * 分页模型
     */
    private final Page<Role> page;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 所在一级容器
     */
    private final Pane inPane;

    /**
     * 构建角色列表
     *
     * @param inPane    列表所在一级容器（1位）
     * @param page    分页模型
     * @param pageSkipInfo 界面跳转信息
     */
    public RoleTableView(Pane inPane, Page<Role> page, PageSkipInfo pageSkipInfo) {

        //维护
        this.inPane = inPane;
        this.page = page;
        this.pageSkipInfo = pageSkipInfo;

        //准备数据
        //1 数据初始化
        List<RoleInfoVo> roleInfoVos = dataInit();
        //2 格式转化(用户数据集合转换成Javafx组件集合)
        ObservableList<RoleInfoVo> users = FXCollections.observableArrayList(roleInfoVos);
        //3 数据添加到表格
        this.setItems(users);

        //新建列头
        TableColumn<RoleInfoVo, String> codeTC = new TableColumn<>("角色编码");
        TableColumn<RoleInfoVo, String> nameTC = new TableColumn<>("角色名称");
        TableColumn<RoleInfoVo, String> builderTC = new TableColumn<>("创建人");
        TableColumn<RoleInfoVo, LocalDateTime> buildTimeTC = new TableColumn<>("创建时间");
        TableColumn<RoleInfoVo, LocalDateTime> alterTimeTC = new TableColumn<>("最近变更时间");
        TableColumn<RoleInfoVo, RoleTableViewVo> operateTC = new TableColumn<>("操作");

        //列头添加到视图
        this.getColumns().addAll(codeTC, nameTC, builderTC, buildTimeTC, alterTimeTC, operateTC);

        //映射（让每一列知道要展示的属性是哪一个）
        codeTC.setCellValueFactory(new PropertyValueFactory<>("code"));
        nameTC.setCellValueFactory(new PropertyValueFactory<>("name"));
        builderTC.setCellValueFactory(new PropertyValueFactory<>("builder"));
        buildTimeTC.setCellValueFactory(new PropertyValueFactory<>("buildTime"));
        alterTimeTC.setCellValueFactory(new PropertyValueFactory<>("alterTime"));
        operateTC.setCellValueFactory(new PropertyValueFactory<>("roleTableViewVo"));

        //自定义界面渲染
        customVRay(buildTimeTC, operateTC);
    }

    /**
     * 数据初始化
     *
     * @return 模拟好的数据集合
     */
    private List<RoleInfoVo> dataInit() {

        //数据总集合
        List<RoleInfoVo> roleInfoVos = new ArrayList<>();

        List<Role> records = page.getRecords();

        for (Object record : records) {
            //解JSON
            JSONObject roleJSON = (JSONObject) record;
            Role javaObject = roleJSON.toJavaObject(Role.class);
            RoleInfoVo roleInfoVo = new RoleInfoVo();
            try {
                BeanUtils.copyProperties(roleInfoVo, javaObject);
                //对象维护 用户操作视图对象
                RoleTableViewVo roleTableViewVo = new RoleTableViewVo();
                BeanUtils.copyProperties(roleTableViewVo, roleInfoVo);
                roleInfoVo.setRoleTableViewVo(roleTableViewVo);

            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
            roleInfoVos.add(roleInfoVo);
        }


        //返回全部数据
        return roleInfoVos;
    }

    /**
     * 操作按钮盒子初始化
     *
     * @param roleTableViewVo 角色编号
     * @return 操作按钮盒子
     */
    private HBox operateHBoxInit(RoleTableViewVo roleTableViewVo) {

        //新建操作盒子
        HBox operateHBox = new HBox();
        operateHBox.setPadding(new Insets(2));
        operateHBox.setSpacing(10);

        //操作按钮(查看权限
        MyButton checkMajorBtn = new MyButton("查看权限");
        operateHBox.getChildren().add(checkMajorBtn);

        //操作按钮(设置权限
        MyButton setMajorBtn = new MyButton("设置权限");
        operateHBox.getChildren().add(setMajorBtn);

        //操作按钮(查看用户
        MyButton checkUserBtn = new MyButton("查看用户");
        operateHBox.getChildren().add(checkUserBtn);
        //事件
        checkUserBtn.setOnAction(event -> {
            //界面跳转
            Pane pane = pageSkipInfo.getPane();//界面所在容器
            Role role = new Role();//对方要的参数
            role.setId(roleTableViewVo.getId());
            role.setName(roleTableViewVo.getName());
            PageUserList pageUserList = new PageUserList(pageSkipInfo,role,page.getCurrent());
            pane.getChildren().set(pageSkipInfo.getIndex(),pageUserList);//跳转
        });

        //操作按钮(添加用户
        MyButton addUserBtn = new MyButton("添加用户");
        operateHBox.getChildren().add(addUserBtn);
        //事件
        addUserBtn.setOnAction(event -> {
            //界面跳转
            Pane pane = pageSkipInfo.getPane();//界面所在容器
            PageAddUserList pageAddUserList = new PageAddUserList(roleTableViewVo,pageSkipInfo,page.getCurrent());
            pane.getChildren().set(pageSkipInfo.getIndex(),pageAddUserList);//跳转

        });

        //操作按钮(编辑角色
        MyButton redactBtn = new MyButton("编辑角色");
        operateHBox.getChildren().add(redactBtn);
        //事件
        RLCompileRoleBtnAction RLCompileRoleBtnAction = new RLCompileRoleBtnAction(roleTableViewVo, pageSkipInfo);
        redactBtn.setOnAction(RLCompileRoleBtnAction);

        //操作按钮(删除角色
        MyButton deleteBtn = new MyButton("删除角色");
        operateHBox.getChildren().add(deleteBtn);
        deleteBtn.setOnAction(new RLDeleteBtnAction(roleTableViewVo,pageSkipInfo,inPane));

        return operateHBox;
    }

    /**
     * 自定义界面渲染
     *
     * @param buildTimeTC 创建时间列
     * @param operateTC   操作列
     */
    private void customVRay(TableColumn<RoleInfoVo, LocalDateTime> buildTimeTC
            , TableColumn<RoleInfoVo, RoleTableViewVo> operateTC) {

        //创建时间列自定义
        buildTimeTC.setCellFactory(new Callback<TableColumn<RoleInfoVo, LocalDateTime>, TableCell<RoleInfoVo, LocalDateTime>>() {
            @Override
            public TableCell<RoleInfoVo, LocalDateTime> call(TableColumn<RoleInfoVo, LocalDateTime> param) {
                return new TableCell<RoleInfoVo, LocalDateTime>() {
                    @Override
                    protected void updateItem(LocalDateTime buildTimeLDT, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(buildTimeLDT, empty);
                        if (buildTimeLDT != null) {
                            LocalDate buildTimeLD = buildTimeLDT.toLocalDate();
                            String buildTimeStr = buildTimeLD.toString();
                            Label buildTimeLab = new Label(buildTimeStr);
                            setGraphic(buildTimeLab);//界面显示
                        }
                    }
                };
            }
        });

        //操作列自定义
        operateTC.setCellFactory(new Callback<TableColumn<RoleInfoVo, RoleTableViewVo>, TableCell<RoleInfoVo, RoleTableViewVo>>() {
            @Override
            public TableCell<RoleInfoVo, RoleTableViewVo> call(TableColumn<RoleInfoVo, RoleTableViewVo> param) {
                return new TableCell<RoleInfoVo, RoleTableViewVo>() {
                    @Override
                    protected void updateItem(RoleTableViewVo roleTableViewVo, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(roleTableViewVo, empty);
                        if (roleTableViewVo != null) {
                            HBox hBox = operateHBoxInit(roleTableViewVo);
                            setGraphic(hBox);//界面显示
                        }
                    }
                };
            }
        });

    }
}
